package lucky.xiong.煞笔面试题.JUC.threadLocal;

import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Random;
import java.util.concurrent.CountDownLatch;

/**
 *
 *          * <b>每一个线程都有自己的一个本地变量副本。</b>
 *          * 此类提供线程局部变量。这些变量与它们的普通对应物不同，因为每个访问一个（通过其 get or set 方法）的线程都有其自己的、
 *          * 独立初始化的变量副本。
 *          * ThreadLocal 实例通常是类中的私有静态字段，希望将状态与线程相关联（例如，用户 ID 或事务 ID）
 *
 *
 *         //threadLocal  翻译：线程局部变量
 * @author XiongJianLin
 * @date Created in 2024/12/3 15:04
 */
class Su7{
    @Getter
    private int saleTotal;  // 本门店总销售额

    public synchronized void saleOne(){
        saleTotal++;
    }

    // 各自销售的销售额
    ThreadLocal<Integer> salePerson = ThreadLocal.withInitial(()->0);
    // 没有synchronized
    public void saleOnePerson(){
        salePerson.set(salePerson.get()+1);
    }


}


public class ThreadLocalTest1 {
//    @NoArgsConstructor


    public static void main(String[] args) throws InterruptedException {
        // 线程  操作  资源类
        Su7 su7 = new Su7();
        // countDownLatch 用于等待3个进程的结果 。 3个销售
        CountDownLatch countDownLatch = new CountDownLatch(3);
        for (int i = 1; i <=3; i++) {
            new Thread(()->{
                try {
                    for (int j = 1; j <= new Random().nextInt(3)+1; j++) {
                        su7.saleOne(); // 整体销售额
                        su7.saleOnePerson(); // 独立销售额
                    }
                    System.out.println(Thread.currentThread().getName()+"\t"+"个人销售"+su7.salePerson.get());
                }finally {
                    countDownLatch.countDown();
                    // 清理threadLocal
//                    su7.salePerson.remove();
                }
                // 线程名
            }, String.valueOf(i)).start();

        }
        countDownLatch.await();


        System.out.println(Thread.currentThread().getName()+"\t"+"销售总额"+su7.getSaleTotal());
        ThreadLocal<String> threadLocal = new ThreadLocal<>();

    }


}
